#ifndef __LITEAT_H
#define __LITEAT_H

/////////////////////////////////////////START
//////声明外部变量
extern  TaskHandle_t xTaskHandle_AtSend;  //Miaozi：任务句柄：AT发送
//////声明外部变量
/////////////////////////////////////////END

/////////////////////////////////////////START
////AT URC回复
typedef enum
{
  //  system
  READY=1,
  BUSY_P,
  //  wifi
  WIFI_CONNECTED,
  WIFI_GOT_IP,
  WIFI_DISCONNECT,
  //  mqtt
//  MQTTDISCONNECTED,
  MQTTSUBRECV,
  //  BLU
  BLUFICONN,
  BLUFIDISCONN,
}AT_URC_E;  
////AT URC回复
/////////////////////////////////////////END

/////////////////////////////////////////START
//////////////////AT执行结果
typedef enum
{
  AT_RET_RUN         =  0,  //  正在执行中
  AT_RET_OK          =  1,  //  成功
  AT_RET_DELAY       =  2,  //  延时--请求延时
  AT_RET_ERROR       =  3,  //  错误
}AT_RETURN_E;
//////////////////AT执行结果
/////////////////////////////////////////END

/////////////////////////////////////////START
////ATRX状态机阶段-task
typedef enum 
{
  ATRECV_STATE_INIT=0,            // 空闲状态，
  ATRECV_STATE_RECEIVEING,        // 接收状态，
  ATRECV_STATE_PARSE_SYSMSG,      // 解析系统指令，
  ATRECV_STATE_PARSE_URCMSG,      // 解析URC指令，
}ATRECV_STATE_E;
////ATRX状态机阶段-task
////AT 指令回复
typedef enum 
{
  ATRECV_RET_NOMATCH   = 0,  ///< 响应不匹配
  ATRECV_RET_OK        = 1,  ///< 正确响应（如 OK）
}ATRECV_RETURN_E;
////AT 指令回复
/////////////////////////////////////////END

/////////////////////////////////////////START
////AtSend状态机阶段-调度层
typedef enum 
{
  ATSEND_STATE_INIT=0,            // 空闲状态，表示当前没有任务正在处理，可以发起新的LITEAT命令
  ATSEND_STATE_SENDING,           // 发送状态，正在通过串口发送LITEAT命令
  ATSEND_STATE_WAITING_RESPONSE,  // 等待响应状态，已发送命令，正在等待模块返回结果
  ATSEND_STATE_SUCCESS,           // 成功状态，表示收到了“期待”响应，命令执行成功
  ATSEND_STATE_FAILED,            // 失败状态，达到最大重试次数后仍未成功，执行失败
  ATSEND_STATE_RETRYING,          // 重试状态，命令响应异常或超时后，准备重新发送
}ATSEND_STATE_E;
////AtSend状态机阶段-调度层
//////ATSend状态机阶段-接口层
typedef enum
{
  ATSEND_STEP_INIT=0,       //  0发送初始化
  ATSEND_STEP_SENDING,      //  1发送中
  ATSEND_STEP_FINISHCHECK,  //  2完成检查
}ATSEND_STEP_E;
//////ATSend状态机阶段-接口层
/////AT命令发送任务的消息结构体
typedef struct 
{
  AT_ID_E cmd_id;     //Miaozi：对应命令表中的索引
  void *params;       //Miaozi：指向参数格式化字符串（可以是设备状态、事件、传感器数据等）
}AT_CMD_MSG_T;
/////AT命令发送任务的消息结构体
/////////////////////////////////////////END

///////////////////////////////////////////AtSend
typedef struct
{
  u8  FsmState;       //Miaozi:运行时状态机
  u8  Event;          //Miaozi:事件标记
  AT_ID_E  SendId;    //Miaozi:发送ID
  u8  CntRetry;       //Miaozi:重试次数

  BUFFER_T     *pAtCmdParasBuf;  //  AT参数  
  BUFFER_T     *pAtCmdSendBuf;   //  动态AT指令：格式化入参
  LITEAT_CMD_T *pAtCmd;          //  静态AT指令：未入参
  SemaphoreHandle_t       tpxMutexAtSend;     //  信号量：AT发送信号量
}LITE_ATSEND_T;
///////////////////////////////////////////AtSend
///////////////////////////////////////////AtRecv
typedef struct
{
  u8  FsmState;       //Miaozi:运行时状态机--预留
  u8  Event;          //Miaozi:事件标记
  AT_ID_E RecvId;         //Miaozi:接收ID

  LITEAT_CMD_T *pAtCmd;                      //Miaozi：静态AT指令
  BUFFER_T                *pAtCmdRecvBuf;    //Miaozi：接收缓存区
  MessageBufferHandle_t   tpxMsgBufAtRecv;   //Miaozi：接收队列
}LITE_ATRECV_T;
///////////////////////////////////////////AtRecv

///////////////////////////////////////////  运行时状态：AT命令
typedef struct
{
  ATRECV_STATE_E eRecvState;                  //  状态阶段（参考命令状态机）
  ATSEND_STATE_E eSendState;                  //  状态阶段（参考命令状态机）
  
  AT_ID_E  AtCmdId;                            //  当前命令序号
  LITE_ATSEND_T             *tpAtSendHandler;  //  AT发送结构体
  LITE_ATRECV_T             *tpAtRecvHandler;  //  AT接收结构体

  QueueHandle_t xQueueAtCmd;                   //  待发送的网络命令队列
  UART_T *tpUart;                              //  串口设备
}LITEAT_T;
extern LITEAT_T    g_tAtHandler;     //  AT运行时指针
///////////////////////////////////////////  运行时状态：AT命令


void LITE_AT_Init(void);                          //  AT模块初始化
void LITE_AT_EnQueueCmd(AT_ID_E index);           //  AT命令入队

void LITE_ATRECV_SetCmdId(AT_ID_E index);         //  设置当前等待回复的AT命令索引
u8   LITE_ATRECV_GetCmdId(void);                  //  得到当前等待回复的AT
void LITE_ATRECV_ClrCmdId(void);                  //  清除当前等待回复的AT
void LITE_ATRECV_UrcProecess(u8 *data,u16 size);  //  AT主动回传消息处理

u8    LITE_ATSEND_Process(void);                  //  ATSEND执行函数
void  LITE_ATSEND_SetCmdid(AT_ID_E AtCmdId);      //  设置ATSEND当前发送命令
void  LITE_ATSEND_SetState(ATSEND_STEP_E Index);  //  设置发送状态机阶段


#endif
/***************************** LiteBsp by Miaozi (END OF FILE) *********************************/
